package partTwo;
import java.util.InputMismatchException;
import java.util.Scanner;

/*本类用于异常的入门案例*/
public class ExceptionDemo {
    //public static void main(String[] args) throws Exception {//问题实际未处理，还报错
    public static void main(String[] args) {
        //method1();//调用暴露异常的方法
        //method2();//调用解决异常的方法--异常解决方案1--捕获处理--自己解决
        /*main()不直接调用会抛出异常的method3()
         * 而是调用f(),f()解决了method3()可能会抛出的异常*/
        f();
        //method3();//调用解决异常的方法--异常解决方案2--向上抛出--交给调用者来解决
    }
    //相当于在main()调用method3()之前解决了method3()可能会抛出的异常
    private static void f() {
        try {
            method3();
        }catch (Exception e){
            System.out.println("您输入的数据不对~请重新输入！");
        }
    }

    /*如果一个方法抛出了异常，那么谁来调用这个方法，谁就需要处理这个异常
     * 这里的处理也有两种方案：捕获解决 或者 继续向上抛出
     * 但注意：我们一般会在main()调用之前将异常解决掉
     * 而不是将问题抛给main(),因为没人解决了，该报错还报错*/
    /*异常抛出的格式：在方法的小括号与大括号之间，写：throws 异常类型
     * 如果有多个异常，使用逗号分隔即可*/
    //0.定义一个解决异常的方法-方案2
    //private static void method3() throws ArithmeticException,InputMismatchException{
    private static void method3() throws Exception{
        //1.复写一下刚刚的代码
        System.out.println("请您输入要计算的第一个整数：");
        int a = new Scanner(System.in).nextInt();
        System.out.println("请您输入要计算的第二个整数：");
        int b = new Scanner(System.in).nextInt();
        System.out.println(a/b);
    }

    /*异常捕获处理的格式：
     * try{
     *    可能会抛出异常的代码
     * }catch(异常的类型 异常的名字){
     *    万一捕获到了异常，进行处理的解决方案
     * }
     * try-catch结构可以嵌套，如果有多种异常类型需要特殊处理的话
     * */
    //0.定义一个解决异常的方法-方案1
    private static void method2() {
        //1.按照捕获处理的格式完成结构
        try{
            //2.复写一下刚刚的代码
            System.out.println("请您输入要计算的第一个整数：");
            int a = new Scanner(System.in).nextInt();
            System.out.println("请您输入要计算的第二个整数：");
            int b = new Scanner(System.in).nextInt();
            System.out.println(a/b);
        }catch(ArithmeticException e){//异常类型 异常名
            System.out.println("除数不能为0！");
        }catch (InputMismatchException e){
            System.out.println("请输入规定的整数类型！");
            /*使用多态的思想，不论是什么子异常，统一看作父类型Exception
             * 做出更加通用的解决方案，甚至可以只写这一个，上面2个不写了*/
        }catch (Exception e){
            System.out.println("您输入的数据不对~请重新输入！");
        }
    }

    //0.定义一个用来暴露异常的方法
    private static void method1() {
        //1.提示并接收用户输入的两个整数
        System.out.println("请您输入要计算的第一个整数：");
        int a = new Scanner(System.in).nextInt();
        System.out.println("请您输入要计算的第二个整数：");
        int b = new Scanner(System.in).nextInt();
        //2.输出两个数除法的结果
        //输入11和0，报错：ArithmeticException--算术异常，除数不能为0，数学规定
        //输入11和3.4，报错：InputMismatchException--输入不匹配异常
        System.out.println(a/b);
        /*1.不要害怕BUG,真正的勇士敢于直面自己写的BUG*/
        /*2.学会看报错的信息提示，确定自己错误的方法*/
        /*3.学会看报错的行号提示，确定自己报错的位置，哪里不对点哪里
         * 注意：源码不会错，要看的是自己写的代码*/
    }
}